package com.bestcem.xm.txtanls.controller.param.chart;

import cn.hutool.core.lang.Validator;
import com.bestcem.xm.common.core.constant.RegTypes;
import com.bestcem.xm.txtanls.enums.PeriodTypeEnum;
import com.bestcem.xm.txtanls.grpc.service.param.chart.*;
import com.bestcem.xm.txtanls.service.dto.chart.PeriodTimeDTO;

import java.util.regex.Pattern;

/**
 * @ClassName ChartValid
 * @Description TODO
 * @Author 无聊的小伙子
 * @Date 2021/8/11 15:18
 * @Version 1.0
 **/
public class ChartValid {

    /**
     * 校验baseChartParam
     * @param baseChartParam 请求参数
     * @return String 错误信息
     * @author jy.zhao
     * @date 2021/12/2 13:42
     **/
    public static String validBaseChartParam(BaseChartParam baseChartParam) {
        if(Validator.isEmpty(baseChartParam.getProjectId())) {
            return "projectId不能为空";
        }
        if (validId(baseChartParam.getProjectId())) {
            return "projectId格式错误";
        }
        // 参数不为空
        PeriodTimeDTO periodTimeDTO = baseChartParam.getTimeRangeDTO().getPeriodTime();
        if(Validator.isNull(periodTimeDTO)) {
            return "周期时间不能为空";
        }
        if(Validator.isNull(periodTimeDTO.getStartTime())) {
            return "周期开始时间不能为空";
        }
        if(Validator.isNull(periodTimeDTO.getEndTime())) {
            return "周期结束时间不能为空";
        }
        if (validId(baseChartParam.getFieldId())) {
            return "fieldId格式错误";
        }
        if (periodTimeDTO.getStartTime().isAfter(periodTimeDTO.getEndTime())) {
            return "周期开始时间必须小于结束时间";
        }
        return null;
    }

    /**
     * 校验viewpointEvaluationTopParam
     * @param periodChartParam
     * @return String
     * @author jy.zhao
     * @date 2021/11/15 14:17
     **/
    public static String validViewpointEvaluationTopParam(PeriodChartParam periodChartParam) {
        String errorMessage = validBaseChartParam(periodChartParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        if (Validator.isNull(periodChartParam.getPeriod()) || (PeriodTypeEnum.CURRENT.getIndex() != periodChartParam.getPeriod() && PeriodTypeEnum.LAST.getIndex() != periodChartParam.getPeriod())) {
            return "周期只能选择本期和上期";
        }
        return null;
    }

    /**
     * 校验topicReferenceParam
     * @param topicReferenceParam
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:32
     **/
    public static String validTopicReferenceParam(TopicReferenceParam topicReferenceParam) {
        String errorMessage = validBaseChartParam(topicReferenceParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        if (validId(topicReferenceParam.getTopicGid())) {
            return "话题id格式错误";
        }
        return null;
    }

    /**
     * 校验词云图参数
     * @param workCloudParam
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:38
     **/
    public static String validWorkCloudParam(WorkCloudParam workCloudParam) {
        String errorMessage = validBaseChartParam(workCloudParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        // 校验topicid格式
        if (validId(workCloudParam.getTopicId())) {
            return "话题id格式错误";
        }
        return null;
    }

    /**
     * 校验话题关联参数
     * @param topicRelationParam
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:41
     **/
    public static String validTopicRelationParam(TopicRelationParam topicRelationParam) {
        String errorMessage = validBaseChartParam(topicRelationParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        // 校验topicid格式
        if (validId(topicRelationParam.getTopicId())) {
            return "话题id格式错误";
        }
        return null;
    }

    /**
     * 校验话题引用趋势
     * @param topicReferenceTrendParam
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:43
     **/
    public static String validTopicReferenceTrendParam(TopicReferenceTrendParam topicReferenceTrendParam) {
        String errorMessage = validBaseChartParam(topicReferenceTrendParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        // 如果话题id和话题组id都为空，返回错误
        if (Validator.isEmpty(topicReferenceTrendParam.getTopicId()) && Validator.isEmpty(topicReferenceTrendParam.getTopicGid())) {
            return "话题id和话题组id不能都为空";
        }
        // 校验topicid格式
        if (validId(topicReferenceTrendParam.getTopicId())) {
            return "话题id格式错误";
        }
        // 校验topicGid格式
        if (validId(topicReferenceTrendParam.getTopicGid())) {
            return "话题组id格式错误";
        }
        return null;
    }

    /**
     * 校验观点评价倾向参数
     * @param param
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:46
     **/
    public static String validViewpointEvaluateTrendParam(ViewpointEvaluateTrendParam param) {
        String errorMessage = validBaseChartParam(param);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        // 如果观点id和观点组id都为空，返回错误
        if (Validator.isEmpty(param.getViewId()) && Validator.isEmpty(param.getViewGid())) {
            return "观点id和观点组id不能都为空";
        }
        // 校验ViewId格式
        if (validId(param.getViewId())) {
            return  "观点id格式错误";
        }
        // 校验ViewGid格式
        if (validId(param.getViewGid())) {
            return "观点组id格式错误";
        }
        return null;
    }
    /**
     * 校验viewpointEvaluateParam
     * @param viewpointEvaluateParam
     * @return String
     * @author jy.zhao
     * @date 2021/8/11 15:36
     **/
    public static String validViewpointEvaluateParam(ViewpointEvaluateParam viewpointEvaluateParam) {
        String errorMessage = validBaseChartParam(viewpointEvaluateParam);
        if(Validator.isNotNull(errorMessage)) {
            return errorMessage;
        }
        if (validId(viewpointEvaluateParam.getViewpointGid())) {
            return "观点id格式错误";
        }
        return null;
    }

    /**
     * 校验id格式是否有误
     *
     * @param id 传入的id
     * @return Boolean
     * @author jy.zhao
     * @date 2021/5/26 15:06
     **/
    public static boolean validId(String id) {
        if (Validator.isNotEmpty(id) && !Pattern.matches(RegTypes.OBJECT_ID, id)) {
            return true;
        }
        return false;
    }
}
